package com.dora.basic.basic.stream;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.IntStream;

/**
 * 并行流丢失数据
 *
 * @author hanchen
 * @date 2024/02/23
 */
public class ParallelStreamDataLossDemo {

    /**
     * 平行流
     * @apiNote 并行流使用了线程不安全的数据结构，导致数据丢失
     */
    @Test
    public void parallelStream() {
        List<Integer> list = new ArrayList<>();
        IntStream.range(0, 100).parallel().forEach(i -> {
            // 这里是一个并行更新操作
            list.add(i);
        });
        System.out.println(list.size());
    }

    /**
     * 并行流 SynchronizedList方式
     */
    @Test
    public void parallelStreamWithSynchronizedList() {
        List<Integer> list = Collections.synchronizedList(new ArrayList<>());
        IntStream.range(0, 100).parallel().forEach(i -> {
            // 这里是一个并行更新操作
            list.add(i);
        });
        System.out.println(list.size());
    }

    /**
     * 并行流 CopyOnWriteArrayList方式
     */
    @Test
    public void parallelStreamWithCopyOnWriteArrayList() {
        List<Integer> list = new CopyOnWriteArrayList<>();
        IntStream.range(0, 100).parallel().forEach(i -> {
            // 这里是一个并行更新操作
            list.add(i);
        });
        System.out.println(list.size());
    }

    /**
     * 并行流 Vector方式
     */
    @Test
    public void parallelStreamWithVector() {
        List<Integer> list = new Vector<>();
        IntStream.range(0, 100).parallel().forEach(i -> {
            // 这里是一个并行更新操作
            list.add(i);
        });
        System.out.println(list.size());
    }
}
